package com.village.friend.pay.alipay;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.CertAlipayRequest;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.demo.trade.config.Configs;
import com.alipay.demo.trade.service.AlipayTradeService;
import com.alipay.demo.trade.service.impl.AlipayTradeServiceImpl;

/**
 * 配置公共参数
 * 创建者
 * 创建时间	2017年7月27日
 */
public final class AliPayConfig {

	 /**
     * 私有的默认构造子，保证外界无法直接实例化
     */
    private AliPayConfig(){}

    /**
     * 签名方式
     */
 	public static String SIGN_TYPE = "RSA2";
	 /**
     * 参数类型
     */
    public static String PARAM_TYPE = "json";
    /**
     * 编码
     */
    public static String CHARSET = "utf-8";
    /**
     * 类级的内部类，也就是静态的成员式内部类，该内部类的实例与外部类的实例
     * 没有绑定关系，而且只有被调用到才会装载，从而实现了延迟加载
     */
    private static class SingletonHolder{
        /**
         * 静态初始化器，由JVM来保证线程安全
         */
		private  static AlipayClient alipayClient;

		private  static AlipayTradeService tradeService;
    }
    /**
     * 支付宝APP请求客户端实例
     * @Author
     * @return  AlipayClient
     * @Date	2017年7月27日
     * 更新日志
     * 2017年7月27日
     *
     */
    public static AlipayClient getAlipayClient(){
        if(SingletonHolder.alipayClient == null){
            AliConfigs.init("zfbinfo.properties");
            CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
            certAlipayRequest.setServerUrl(Configs.getOpenApiDomain());  //gateway:支付宝网关（固定）https://openapi.alipay.com/gateway.do
            certAlipayRequest.setAppId(Configs.getAppid());  //APPID 即创建应用后生成,详情见创建应用并获取 APPID
            certAlipayRequest.setPrivateKey(Configs.getPrivateKey());  //开发者应用私钥，由开发者自己生成
            certAlipayRequest.setFormat(PARAM_TYPE);  //参数返回格式，只支持 json 格式
            certAlipayRequest.setCharset(CHARSET);  //请求和签名使用的字符编码格式，支持 GBK和 UTF-8
            certAlipayRequest.setSignType(SIGN_TYPE);  //商户生成签名字符串所使用的签名算法类型，目前支持 RSA2 和 RSA，推荐商家使用 RSA2。

            //路径需要通过下载的 支付宝开放平台开发助手 软件生成
            //生成后把其中的公钥证书上传到支付宝 并下载下面三个证书文件
            certAlipayRequest.setCertPath(AliConfigs.getAppCertPath()); //应用公钥证书路径（app_cert_path 文件绝对路径）
            certAlipayRequest.setAlipayPublicCertPath(AliConfigs.getAlipayCertPath()); //支付宝公钥证书文件路径（alipay_cert_path 文件绝对路径）
            certAlipayRequest.setRootCertPath(AliConfigs.getAlipayRootCertPath());  //支付宝CA根证书文件路径（alipay_root_cert_path 文件绝对路径）

            try {
                SingletonHolder.alipayClient = new DefaultAlipayClient(certAlipayRequest);
            } catch (AlipayApiException e) {
                e.printStackTrace();
                throw new RuntimeException("创建支付宝client失败");
            }
        }
        return SingletonHolder.alipayClient;
    }
    /**
     * 电脑端预下单
     * @Author
     * @return  AlipayTradeService
     * @Date	2017年7月27日
     * 更新日志
     * 2017年7月27日
     *
     */
    public static AlipayTradeService getAlipayTradeService(){
        getAlipayClient();
        if(SingletonHolder.alipayClient == null){
            SingletonHolder.tradeService = new AlipayTradeServiceImpl.ClientBuilder().build();
        }
        return SingletonHolder.tradeService;
    }
}
